home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Komputer 2010 April
/
PCWorld0410.iso
/
pluginy Firefox
/
60750
/
60750.xpi
/
chrome
/
chromeFiles
/
content
/
bindings
/
btfeedreader3.xml
< prev
next >
Wrap
Extensible Markup Language
|
2010-01-20
|
14KB
|
383 lines
<?xml version="1.0"?>
<bindings id="feedreaderBindings"
xmlns="http://www.mozilla.org/xbl"
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:xbl="http://www.mozilla.org/xbl">
<binding id="feedreader" extends="xul:box">
<content>
<xul:toolbaritem id="feedreader" flex="1">
<xul:image id="feedreader-left-cap"/>
<xul:button tooltiptext="Toggle News Sidebar" id="feedreader-sidebar-toggle"/>
<xul:button tooltiptext="Reload Feed" id="feedreader-reload" xbl:inherits="hidden=hidereloadbutton" oncommand="readFeed()"/>
<xul:button tooltiptext="Previous Item" id="feedreader-previous" oncommand="previousFeedItem(true)"/>
<xul:button tooltiptext="Next Item" id="feedreader-next" oncommand="nextFeedItem(true)"/>
<xul:hbox id="feedreader-textbox" disabled="true" xbl:inherits="width" flex="1">
<xul:toolbarbutton label="Loading..." crop="end" pack="start" anonid="feedreader-item" flex="1" type="menu-button">
<xul:menupopup position="after_end" id="feedreader-select-popup" anonid="feedreader-select-popup">
</xul:menupopup>
</xul:toolbarbutton>
</xul:hbox>
<xul:image id="feedreader-right-cap" />
</xul:toolbaritem>
<children includes="btfeed" />
</content>
<handlers>
<handler event="command">
<![CDATA[
if (event.originalTarget.hasAttribute("bt-url")) {
var subject = {};
subject.wrappedJSObject = this.brandObject;
this.observerService.notifyObservers(subject, "brandthunder", this.id);
this.brandObject.utilities.openLink(this.brandObject, event, event.originalTarget.getAttribute("bt-url"));
} else if (event.originalTarget.hasAttribute("bt-feed")) {
this.currentfeed = event.originalTarget.getAttribute("bt-feed");
this.readFeed(event.originalTarget.getAttribute("bt-feed"));
var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
this.btPrefBranch.setCharPref(currentBoom + ".currentfeed", this.currentfeed);
}
]]>
</handler>
<handler event="popupshowing">
<![CDATA[
if (event.originalTarget.getAttribute("anonid") == "feedreader-select-popup") {
for (let i= event.originalTarget.childNodes.length - 1; i >= 0; i--) {
if (event.originalTarget.childNodes.item(i).getAttribute("bt-feed") == this.currentfeed) {
event.originalTarget.childNodes.item(i).setAttribute("checked", "true");
} else {
event.originalTarget.childNodes.item(i).removeAttribute("checked");
}
}
}
]]>
</handler>
</handlers>
<implementation>
<constructor>
<![CDATA[
if (this.childNodes.length) {
this.currentfeed = this.childNodes[0].getAttribute('src');
} else if (this.hasAttribute("feed")) {
this.currentfeed = this.getAttribute("feed");;
} else {
return;
}
if (this.childNodes.length > 1) {
var menupopup = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-select-popup");
for (var i=0; i < this.childNodes.length; i++) {
if (this.childNodes[i].hasAttribute("src") && this.childNodes[i].hasAttribute("title")) {
var menuitem = document.createElement("menuitem");
menuitem.setAttribute("label", childNodes[i].getAttribute("title"));
menuitem.setAttribute("bt-feed", childNodes[i].getAttribute("src"));
menuitem.setAttribute("type", "checkbox");
menupopup.appendChild(menuitem);
}
}
} else {
var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
feedReaderItemButton.removeAttribute("type");
}
this.observerService = Components.classes["@mozilla.org/observer-service;1"]
.getService(Components.interfaces.nsIObserverService)
if (this.hasAttribute('brand')) {
this.brandObject = BrandThunder.clients[this.getAttribute('brand')];
}
this.btPrefBranch = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService)
.getBranch("extensions.brandthunder.");
try {
var currentBoom = this.btPrefBranch.getCharPref("currentBoom");
this.currentfeed = this.btPrefBranch.getCharPref(currentBoom + ".currentfeed" );
} catch(ex) {}
if (this.hasAttribute('numitems')) {
this.numitems = this.getAttribute('numitems');
}
if (this.hasAttribute('rotationdelay')) {
this.rotationdelay = this.getAttribute('rotationdelay') * 1000;
}
if (this.hasAttribute('sidebar')) {
this.sidebarID = this.getAttribute('sidebar');
document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('observes', this.sidebarID);
} else {
document.getAnonymousElementByAttribute(this, 'id', 'feedreader-sidebar-toggle').setAttribute('hidden', true);
}
this.readFeed();
function reloadFeed(feedreader) {
return function() {
feedreader.readFeed(feedreader.currentfeed, feedreader);
}
}
this.reloadTimer = window.setInterval(reloadFeed(this), this.reloaddelay);
]]>
</constructor>
<destructor>
window.clearInterval(this.rotationTimer);
window.clearInterval(this.reloadTimer);
</destructor>
<field name="currentfeed"/>
<field name="feedItems">
[];
</field>
<field name="numitems">
-1;
</field>
<field name="feedIndex">
0;
</field>
<field name="selectedIndex">
0;
</field>
<field name="rotationdelay">
5000;
</field>
<field name="reloaddelay">
1800000;
</field>
<field name="itemtitleprefix">
"";
</field>
<field name="itemurlprefix">
"";
</field>
<field name="currentFeedItem">
0
</field>
<field name="rssdeckElement">
document.getAnonymousElementByAttribute(this, 'id', 'feedreader-deck');
</field>
<field name="rotationTimer">
</field>
<field name="reloadTimer">
</field>
<field name="readSrcTimer">
</field>
<field name="sidebarID">
""
</field>
<field name="brandObject"/>
<field name="btClientBranch"/>
<field name="observerService"/>
<method name="startFeedRotation">
<body>
<![CDATA[
function advance(feedreader) {
return function() {
feedreader.nextFeedItem();
}
}
this.rotationTimer = window.setInterval(advance(this), this.rotationdelay);
]]>
</body>
</method>
<method name="updateFeedItem">
<body>
<![CDATA[
if (this.feedItems == 0) {
return;
}
var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
feedReaderItemButton.setAttribute("label", this.feedItems[this.currentFeedItem].title);
feedReaderItemButton.setAttribute("tooltiptext", this.feedItems[this.currentFeedItem].title);
if (this.childNodes.length > 1) {
document.getAnonymousElementByAttribute(feedReaderItemButton, "anonid", "button").setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
} else {
feedReaderItemButton.setAttribute('bt-url', this.feedItems[this.currentFeedItem].url);
}
]]>
</body>
</method>
<method name="previousFeedItem">
<parameter name="resetTimer" />
<body>
<![CDATA[
if (resetTimer) {
window.clearInterval(this.rotationTimer);
this.rotationTimer = 0;
this.startFeedRotation();
}
var numItems;
if ((this.numitems > -1) && (this.feedItems.length >= this.numitems)) {
numItems = this.numitems;
} else {
numItems = this.feedItems.length;
}
this.currentFeedItem--;
if (this.currentFeedItem < 0) {
this.currentFeedItem = numItems-1;
}
this.updateFeedItem();
]]>
</body>
</method>
<method name="nextFeedItem">
<parameter name="resetTimer" />
<body>
<![CDATA[
if (resetTimer) {
window.clearInterval(this.rotationTimer);
this.rotationTimer = 0;
this.startFeedRotation();
}
var numItems;
if ((this.numitems > -1) && (this.feedItems.length >= this.numitems)) {
numItems = this.numitems;
} else {
numItems = this.feedItems.length;
}
this.currentFeedItem++;
if (this.currentFeedItem >= numItems) {
this.currentFeedItem = 0;
}
this.updateFeedItem();
]]>
</body>
</method>
<method name="readFeed">
<parameter name="feed" />
<parameter name="feedreader" />
<body>
if (!feedreader) {
feedreader = this;
}
<![CDATA[
if (!feed) {
feed = feedreader.currentfeed;
}
feedreader.feedItems = [];
var xhr = new XMLHttpRequest();
xhr.open('GET', feed, true);
xhr.onload = function() {
feedreader.parseFeed(xhr.responseText);
}
xhr.send(null);
]]>
</body>
</method>
<method name="parseFeed">
<parameter name="xml" />
<body>
<![CDATA[
var parser = new DOMParser();
var dom = parser.parseFromString(xml, 'text/xml');
// check for error
if (dom.documentElement.nodeName == 'parsererror')
throw new Error('Could not parse feed');
var xmlDoc = dom.documentElement;
switch (xmlDoc.nodeName.toLowerCase()) {
case 'feed': this.parseAtom(xmlDoc); break;
case 'rdf:rdf': this.parseRss(xmlDoc); break;
case 'rss': this.parseRss(xmlDoc); break;
}
if (this.feedItems.length > 0) {
this.currentFeedItem = 0;
this.updateFeedItem();
// this.startFeedRotation();
} else {
var feedReaderItemButton = document.getAnonymousElementByAttribute(this, "anonid", "feedreader-item");
feedReaderItemButton.setAttribute("label", "No Feed Items");
}
]]>
</body>
</method>
<method name="parseAtom">
<parameter name="xmlDoc" />
<body>
<![CDATA[
var domParser = new DOMParser();
var header = '<?xml version="1.0"?>\n'+
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"\n'+
'"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">\n'+
'<html:html xml:lang="en" xmlns:html="http://www.w3.org/1999/xhtml">\n';
var footer = "</html:html>"
var entries = xmlDoc.getElementsByTagName('entry');
for (var i = 0; i < entries.length; i++) {
this.feedItems[i] = ['title', 'url'];
//load the entry title
this.feedItems[i]['title'] = entries[i].getElementsByTagName('title')[0].textContent;
if (entries[i].getElementsByTagName('title')[0].hasAttribute("type") &&
entries[i].getElementsByTagName('title')[0].getAttribute("type") == "html") {
var e = domParser.parseFromString(header + this.feedItems[i]['title'] + footer, "text/xml")
this.feedItems[i]['title'] = e.documentElement.textContent;
}
//if <id> is an absolute URL, use that
var elem = entries[i].getElementsByTagName('id');
for (var j = 0; j < elem.length; j++) {
var kids = elem[j].childNodes;
if (kids.length > 0) {
var val = kids[0].nodeValue;
if (val != null && val.match(/^http:\/\//)) {
this.feedItems[i]['url'] = val;
break;
}
}
}
//instead look for a <link> tag
if (this.feedItems[i]['url'] == null) {
var elem = entries[i].getElementsByTagName('link');
for (var j = 0; j < elem.length; j++) {
var rel = elem[j].getAttribute('rel');
if (rel == null || rel == 'alternate') {
this.feedItems[i]['url'] = elem[j].getAttribute('href');
break;
}
}
}
if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
throw new Error('Invalid feed');
}
]]>
</body>
</method>
<method name="parseRss">
<parameter name="xmlDoc" />
<body>
<![CDATA[
var items = xmlDoc.getElementsByTagName('item');
for (var i = 0; i < items.length; i++) {
this.feedItems[i] = ['title', 'url'];
var titleElem = items[i].getElementsByTagName('title');
if (titleElem.length > 0)
this.feedItems[i]['title'] = titleElem[0].textContent;
var linkElem = items[i].getElementsByTagName('link');
if (linkElem.length > 0)
this.feedItems[i]['url'] = linkElem[0].textContent;
if (this.feedItems[i]['title'] == null || this.feedItems[i]['url'] == null)
throw new Error('Invalid feed');
}
]]>
</body>
</method>
</implementation>
</binding>
<binding id="feed"></binding>
</bindings>